cat restartDocker.sh
#!/bin/sh
#####>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>接收配置参数<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

proj=$(echo ${1}|cut -d"|" -f1)
app=$(echo ${1}|cut -d"|" -f2)
#-------JVM参数配置------------
#DEBUG
debugEnable=$(echo ${1}|cut -d"|" -f3)
debugPort=$(echo ${1}|cut -d"|" -f4)
#JMX
jmxEnable=$(echo ${1}|cut -d"|" -f5)
jmxport=$(echo ${1}|cut -d"|" -f6)
#SKYWALKING
skywalkingEnable=$(echo ${1}|cut -d"|" -f7)
jvmExtraOpt=$(echo ${1}|cut -d"|" -f8)

#---------- DOCKER参数配置 ----------
images=$(echo ${1}|cut -d"|" -f9)
#docker 其他参数  如限定容器内存 --memory=2G|4M ，限定CPU --cpus=5
dockerExtraVal=$(echo ${1}|cut -d"|" -f10)

#---------- 其他参数配置 ----------
#是否用tomcat 启动的服务 
isTomcat=$(echo ${1}|cut -d"|" -f11)

#添加参数 后期如果APP1 添加 参数A， 用11  ， APP2再添加参数 需要预留11 ， 用12位置的参数， 对应位置可以设置默认值

container=${app}
#指定为服务器本机IP
jmxip=$(hostname -I|awk  '{print $1}')

#---------------------------------------        全局默认参数                ------------------------------
#生产环境 可以统一把这三个参数设置为非 true 的值  来关闭
#jmxEnable=false
#debugEnable=false
#skywalkingEnable=false

#私仓地址
registry=10.10.104.160:5000
#skywalking 服务器地址
skywalkingServer=10.10.104.61:11800

#配置路径目录 ,可以改造成 以项目为目录命名
confBaseDir=/opt/nfs/snsoft_gtc
#####>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>参数转换<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


#debug 模式 生产一般不开
 debugStr=""
 if [ "$debugEnable" = "true" ]; then
    debugStr="-Xdebug  -Xrunjdwp:transport=dt_socket,address=${debugPort},server=y,suspend=n "
 fi

#skywalking 配置 生产看情况开启 , 需要把包放到 挂载目录对应的宿主目录中
skywalkingStr=""
if [ "$skywalkingEnable" = "true" ]; then
    skywalkingStr="-javaagent:/snconfig/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${app}_test -Dskywalking.collector.backend_service=${skywalkingServer}"
fi

 #JVM远程监控 生产一般不开
jmxStr=""
if [ "$jmxEnable" = "true" ]; then
    jmxStr="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=${jmxport} -Djava.rmi.server.hostname=${jmxip}"
fi


#转换tomcat参数名  使用CATALINA_OPTS,否则使用JVM_OPTS
#JVMTYPE_OPTS_NAME=""
# if [ "$isTomcat" = "true" ]; then
#    JVMTYPE_OPTS_NAME="CATALINA_OPTS"
# else
#    JVMTYPE_OPTS_NAME="JVM_OPTS"
# fi

tomcatLog_volumn=""
#转换tomcat参数名  使用CATALINA_OPTS,否则使用JVM_OPTS
JVMTYPE_OPTS_NAME=""
if [ "$isTomcat" = "true" ]; then
    JVMTYPE_OPTS_NAME="CATALINA_OPTS"
    tomcatLog_dir="/data/tomcat/$app/logs"
    #创建tomcat日志目录(宿主机上)
    [ ! -d "$tomcatLog_dir" ] && mkdir -p $tomcatLog_dir
    #每次重启时清理之前的日志信息
    rm -rf $tomcatLog_dir/*
    tomcatLog_volumn=" -v $tomcatLog_dir:/usr/local/tomcat/logs:rw"
else
    JVMTYPE_OPTS_NAME="JVM_OPTS"
fi



#默认不限制 未启用 
#内存限制 默认 32G
#dockerMem=${dockerMemLimit:=--memory=32G}
#CPU限制 默认16U
#dockerCpu=${dockerCpuLimit:=--cpus=16}

##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>启动<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#清理历史 ， 如果是初次运行 会报错， 不影响

docker stop -t 10 ${container}
docker rm -fv ${container}
#备份镜像
docker tag ${registry}/${images} ${registry}/${images}_bak
#拉取最新镜像
docker pull ${registry}/${images}
#删除未知镜像
docker images | grep 'none' | awk '{print $3}' | xargs docker rmi

##是否启动QoS  qos是Dubbo的在线运维命令，可以对服务进行动态的配置、控制及查询
dubboQos="-Ddubbo.application.qos.enable=false"

dockerStr="docker run -it --restart always -d  --privileged=true  --net=host --hostname localhost --name ${container} \
-e  ${JVMTYPE_OPTS_NAME}=\" ${jvmMemory} ${debugStr} ${skywalkingStr} ${jmxStr} ${jvmExtraOpt} ${dubboQos}\" \
-v ${confBaseDir}/${app}/snconfig/:/snconfig/:rw  -v ${confBaseDir}/${proj}-comm/:/comm/:rw -v ${confBaseDir}/skywalking/agent/:/snconfig/agent/:rw \
$tomcatLog_volumn ${dockerExtraVal} ${registry}/${images}"


echo -e "启动命令:\n${dockerStr}\n"

#启动docker
echo $dockerStr |sh
 
#docker 命令出错 即返回 
if [ $? -ne 0 ]; then
    echo "ERROR ----------------- 启动服务失败，具体请看上面信息!!!!! ----------------------------"
   exit 1
fi